home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / fb386 / getdir / getdir2.asm < prev    next >
Assembly Source File  |  1991-10-18  |  6KB  |  274 lines

  1. ;  getdir2.asm 91.03.13
  2. ;  copyright(c)1991 K.Kurosaki 
  3.  
  4.                 .386p
  5. inter        =    0        ; コンパイラのときはコメントに    
  6.  
  7. param           struc
  8.                 dd        ?        ; eip
  9. p1              dd        ?        ; p1        機能番号(値)
  10. p2              dd        ?        ; p2        ファイルパス(アドレス)
  11. p3              dd        ?        ; p3        ファイル属性(値)
  12. p4              dd        ?        ; p4        格納文字列個数(アドレス)
  13. p5              dd        ?        ; p5        格納文字列(アドレス)
  14. param           ends
  15.  
  16. code            segment    dword public ER use32 'CODE'
  17.                 assume     cs:CODE
  18.  
  19. getdir          proc    near
  20.  
  21.                 mov     ebp,esp
  22.  
  23.         cmp    word ptr [ebp].p1,2    ; 機能番号
  24.         ja    err05            ; 機能番号エラー
  25.  
  26.         xor    ecx,ecx
  27.         mov    ebx,[ebp].p2        ; ファイルパス     
  28.         mov     cx,[ebx+4]
  29.                 cmp    cx,0            ; 文字列長が0
  30.                 je      err07
  31.  
  32.         mov    ebx,[ebx]        ; 文字列の先頭へ
  33.         cmp    word ptr [ebp].p1,2
  34.         je    getdir40        ; カレントディスク,ディレクトリ
  35. getdir06:
  36.         cmp    byte ptr [ebx],0
  37.         je      getdir08        ; 最後は0のはず
  38.  
  39.         inc    ebx
  40.         loop    getdir06     
  41.  
  42.         jmp    err07            ; 最後が0じゃなかった
  43. getdir08:
  44.         mov    edx,offset dta
  45.         mov    ah,1ah            ; DTAのセット
  46.         int    21h
  47.  
  48.         cmp    word ptr [ebp].p1,0    ; 機能番号
  49.         je    getdir12        ; 個数カウントのみ
  50.     
  51.         mov    ebx,[ebp].p4
  52.         mov    ecx,[ebx]        ; 格納ファイル数
  53.         cmp    ecx,0
  54.         je    err07            ; 領域不足
  55.  
  56.         push    ecx
  57.         mov    ebx,[ebp].p5        ; 格納文字列アドレス
  58.         mov    ax,2020h        ; スペースで埋める
  59. getdir10:    
  60.         mov    edi,[ebx]        ; アドレス
  61.         mov    dx,[ebx+4]        ; 長さ
  62.         cmp    ebx,24
  63.         jb    err08            ; 24文字未満はエラー
  64.  
  65.         push    ecx
  66.         mov    ecx,12            ; 2バイト×12回
  67.         rep    stosw
  68.         pop    ecx
  69.  
  70.         ifdef   inter
  71.         add    ebx,6            ;  次の位置へ(インタプリタ)
  72.         else
  73.         add    ebx,14            ;  次の位置へ(コンパイラ)
  74.         endif
  75.         loop    getdir10
  76.  
  77.         pop    ecx
  78. getdir12:
  79.         push    ecx
  80.         mov    ebx,[ebp].p2
  81.                 mov     edx,[ebx]           ; サーチするファイルパス
  82.         mov    ecx,[ebp].p3        ; ファイル属性        
  83.                 mov     ah,4eh
  84.                 int     21h                 ; 最初のサーチ
  85.                 pop     ecx
  86.                 jc      errx10              ; ファイルなし
  87.  
  88.         cmp    word ptr [ebp].p1,0
  89.         je    getdir30        ; カウントのみ
  90.  
  91.                 mov     ebx,[ebp].p5        ; 格納先配列開始アドレス
  92.                 call    infsave            ; ファイル情報の格納
  93.         jc    err01            ; ファイル形式がおかしい
  94. getdir20:
  95.         ifdef    inter    
  96.         add    ebx,6            ; 次の配列位置へ(インタプリタ)
  97.         else
  98.         add    ebx,14            ; 次の配列位置へ(コンパイラ)
  99.         endif
  100.  
  101.         push    ecx        
  102.                 push    ebx
  103.                 mov     ah,4fh              ; 次のサーチ
  104.                 int     21h
  105.         pop     ebx
  106.                 pop     ecx
  107.                 jc      err00            ; 合うファイルがもうない
  108.  
  109.         dec    ecx
  110.         je    err07            ; 格納場所がなくなった
  111.         
  112.                 call    infsave
  113.         jc    err01
  114.  
  115.                 jmp     getdir20
  116.  
  117. getdir30:
  118.         xor    ecx,ecx            ; ファイル個数カウンタ
  119. getdir32:
  120.         inc    ecx
  121.         push    ecx
  122.                 mov     ah,4fh              ; 次のサーチ
  123.                 int     21h
  124.                 pop     ecx
  125.                 jnc     getdir32        ; 合うファイルがもうない
  126.  
  127.         mov    ebx,[ebp].p4
  128.         mov    [ebx],ecx        ; ファイル個数
  129.  
  130.         mov    eax,0            ; 全ファイルサーチ
  131.                 ret
  132. getdir40:
  133.         cmp    ecx,64+3
  134.         jb    err07            ; 格納文字列の長さが足りない
  135.  
  136.         push    ebx
  137.         mov    ah,19h            ; カレントディスクの獲得
  138.         int    21h
  139.         pop    ebx
  140.  
  141.         add    al,'A'
  142.         mov    [ebx],al        ; アスキーに直して
  143.         mov    ax,'\:'             
  144.         mov    [ebx+1],ax
  145.         add    ebx,3            
  146.  
  147.         mov    esi,ebx            ; デェレクトリの格納先
  148.         xor    dx,dx            ; カレントドライブ指定
  149.         mov    ah,47h
  150.         int    21h                        
  151.         jc    err04            ; エラーがあるはずないけど
  152.         
  153. err00:
  154.         mov    eax,0            ; 正常終了
  155.         jmp    errx20
  156.  
  157. err01:
  158.         mov    eax,1            ; ファイル名領域不良    
  159.         jmp    errx20
  160.  
  161. errx10:
  162.         mov    dx,ax
  163.         mov    eax,2            ; 対象ファイル無し
  164.         cmp    dx,12h
  165.         je    errx12
  166.  
  167.         mov    eax,3            ; ファイルパス無効
  168.         cmp    dx,2h
  169.         je    errx12
  170. err04:
  171.         mov    eax,4            ; 未知のファンクションエラー
  172. errx12:
  173.         ret
  174. err05:
  175.                 mov    eax,5            ; 機能番号異常
  176.                 ret
  177. err06:
  178.                 mov    eax,6            ; ファイルパス指定異常
  179.                 ret
  180. err07:
  181.                 mov    eax,7            ; 領域不足
  182. errx20:
  183.         mov    ebx,[ebp].p4
  184.         mov    edx,[ebx]
  185.         sub    edx,ecx
  186.         inc    edx
  187.         mov    [ebx],edx        ; ファイル個数
  188.  
  189.                 ret
  190. err08:
  191.         mov    eax,8            ; 文字列長不足
  192.         ret
  193.  
  194. getdir          endp
  195.  
  196. infsave        proc    near
  197.  
  198.         push    ecx    
  199.  
  200.                 mov     esi,offset dta+15h         ; PSPのオフセット
  201.  
  202.         mov     edi,[ebx]
  203.  
  204.                 mov     al,[esi]             ; 属性 
  205.                 mov     [edi],al
  206.  
  207.                 mov     ax,[esi+1]           ; 時刻 
  208.         mov    dx,ax
  209.                rol    ax,4
  210.                 and    ax,1fh
  211.                 mov     [edi+1],al        ; 時
  212.  
  213.         mov    ax,dx
  214.         shr    ax,5
  215.         and    ax,3fh
  216.               mov    [edi+2],al        ; 分
  217.  
  218.         shl    dx,1
  219.         and    dx,3fh
  220.         mov    [edi+3],dl        ; 秒    
  221.  
  222.                 mov     ax,[esi+3]           ; 日時 
  223.         mov    dx,ax
  224.                rol    ax,7
  225.                 and    ax,7fh
  226.                 mov     [edi+4],al        ; 年
  227.  
  228.         mov    ax,dx
  229.                shr    ax,5
  230.                 and    ax,0fh
  231.                 mov     [edi+5],al        ; 月
  232.  
  233.         and    dx,1fh
  234.                 mov     [edi+6],dl        ; 日
  235.         
  236.         mov    al,[esi+5]        ; ファイルサイズ
  237.         mov    [edi+10],al
  238.         mov    al,[esi+6]
  239.         mov    [edi+9],al
  240.         mov    al,[esi+7]
  241.         mov    [edi+8],al
  242.         mov    al,[esi+8]
  243.         mov    [edi+7],al
  244.  
  245.         mov    esi,offset dta+1eh    ; ファイル名
  246.  
  247.         add    edi,11
  248.         mov    ecx,13
  249. infsave10:
  250.         mov    al,[esi]
  251.         inc    esi
  252.         cmp    al,0
  253.         je    infsave20        ; 最後は0のはず
  254.  
  255.         mov    [edi],al
  256.         inc    edi
  257.  
  258.         loop    infsave10
  259.  
  260.         pop    ecx
  261.         stc                ; 最後に0が来なかった
  262.         ret
  263. infsave20:
  264.         pop    ecx
  265.         clc                ; 正常終了
  266.                 ret
  267.  
  268. infsave        endp
  269.  
  270. dta        db    256 dup(?)
  271.  
  272. CODE            ends
  273.                 end
  274.